package cn.xiaolang.thread.lock;

/**
 * 不可重入锁使用示例
 *
 * @author fuhw/DeanKano
 * @date 2019-01-08
 */
public class MyNonReentrantLockApply {
	
	private MyNonReentrantLock lock = new MyNonReentrantLock();
	
	public void print() throws InterruptedException {
		lock.lock();
		doAdd();
		lock.unlock();
	}
	
	public void doAdd() throws InterruptedException {
		lock.lock();
		lock.unlock();
	}
	/**
	 * 要执行这两个方法，有一个前提就是，当前线程必须获其对象的monitor（俗称“锁”），否则会抛出IllegalMonitorStateException异常
	 * 当前线程执行print()方法首先获取lock，接下来执行doAdd()方法就无法执行doAdd()中的逻辑，必须先释放锁。这个例子很好的说明了不可重入锁。
	 * 会导致第二次调用lock位置进行自旋，产生了死锁说明这个锁并不是可重入的。（在lock函数内，应验证线程是否为已经获得锁的线程）
	 * @throws InterruptedException
	 * @author fuhw/DeanKano
	 */
	public static void main(String[] args) throws InterruptedException {
		MyNonReentrantLockApply apply = new MyNonReentrantLockApply();
		apply.print();
	}
}
